﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Biblioteca.Logica_Negocio.Domain_Model
{
    [Table("Prestamos")]
    public class Prestamo 
    {
        public enum EstadoPrestamo { Pendiente = 1, Despachado = 2, Devuelto = 3, Cancelado = 4 }

        public Prestamo()
        {
        }

        public Prestamo(Socio socio, Ejemplar ejemplar, int cantdias)
        {
            this.Socio = socio;
            this.Ejemplar = ejemplar;
            this.Fecha = DateTime.Today;
            this.Estado = EstadoPrestamo.Pendiente;
            this.CantDias = cantdias;
        }

        public int Id { get; set; }

        public virtual Socio Socio { get; set; }

        public virtual Ejemplar Ejemplar { get; set; }

        public int CantDias { get; set; }

        public virtual int EstadoInterno { get; set; }

        [NotMapped]
        public EstadoPrestamo Estado
        {
            get { return (EstadoPrestamo)EstadoInterno; }
            set { EstadoInterno = (int)value; }
        }

        [NotMapped]
        public DateTime FechaVencimiento { get{
            if (this.EstaPendiente())
                return Fecha.AddDays(3);
            else
                return Fecha.AddDays(CantDias);
          ;
        }
        }

        public virtual DateTime Fecha { get; protected set; }
        
        public virtual void Despachar()
        {
            this.Estado = EstadoPrestamo.Despachado;
            this.Fecha = DateTime.Today;
        }

        public virtual void Devolver()
        {
            this.Estado = EstadoPrestamo.Devuelto;
            this.Ejemplar.PonerDisponible();
            this.Fecha = DateTime.Today;
            this.Ejemplar.Reasignar();
        }

        public virtual void Cancelar() {
            this.Estado = EstadoPrestamo.Cancelado;
            this.Ejemplar.PonerDisponible();
            this.Fecha = DateTime.Today;
            this.Ejemplar.Reasignar();
        }

        public bool EstaPendiente()
        {
            return (this.Estado == EstadoPrestamo.Pendiente);
        }

        public bool EstaDespachado()
        {
            return (this.Estado == EstadoPrestamo.Despachado);
        }

        public bool EstaFinalizado()
        {
            return ((this.Estado == EstadoPrestamo.Cancelado)||(this.Estado == EstadoPrestamo.Devuelto));
        }
    }
}